package com.juzipi.common.utils.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.Collection;
import java.util.concurrent.TimeUnit;

/**
 * redis 工具类
 */
@Component
public class RedisUtils {

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 缓存基本的对象
     * @param key 缓存的键
     * @param value 缓存的值
     */
    public void setCacheObject(final String key,final Object value){
        redisTemplate.opsForValue().set(key,value);
    }


    /**
     *
     * @param key 键值
     * @param value 值
     * @param timeout 时间
     * @param timeUnit 时间单位
     */
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){
        redisTemplate.opsForValue().set(key,value,timeout,timeUnit);
    }


    /**
     * 设置有效时间
     * @param key redis键
     * @param timeout 超时时间
     * @return true成功 false失败
     */
    public boolean expire(final String key,final long timeout){
        return expire(key,timeout,TimeUnit.SECONDS);
    }


    /**
     * 设置有效时间
     * @param key redis键
     * @param timeout 超时时间
     * @param timeUnit 时间单位
     * @return true成功 false失败
     */
    public boolean expire(final String key,final long timeout,final TimeUnit timeUnit){
        return redisTemplate.expire(key,timeout,timeUnit);
    }


    /**
     * 获取缓存的基本对象
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key){
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        return operation.get(key);
    }


    /**
     * 删除单个对象
     * @param key
     * @return
     */
    public boolean deleteObject(final String key){
        return redisTemplate.delete(key);
    }


    /**
     * 删除集合对象
     * @param collection
     * @return
     */
    public long deleteObject(final Collection collection){
        return redisTemplate.delete(collection);
    }


    /**
     * 获取缓存的基本对象列表
     * @param pattern 字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern){
        return redisTemplate.keys(pattern);
    }


}
